This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library(dplyr)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(ggplot2)
Find out what's changed in ggplot2 at https://github.com/tidyverse/ggplot2/releases.
library(dygraphs)
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(gridExtra)

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine
library(rlist)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(plotly)

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
#setwd("~/Desktop/WhatKillsNewYorkers")
getwd()
[1] "/Users/macbook/Desktop/Shiny_project/WhatKillsNewYorkers"
df = read.csv("New_York_City_Leading_Causes_of_Death.csv")

# Observe Data 
sapply(df, class)
                   Year           Leading.Cause                     Sex          Race.Ethnicity 
               "factor"                "factor"                "factor"                "factor" 
                 Deaths              Death.Rate Age.Adjusted.Death.Rate 
               "factor"                "factor"                "factor" 
df <- df[-c(1097,1096,1095), ]
summary(df)
      Year                                            Leading.Cause     Sex     
 2007   :141   All Other Causes                              : 96         :  0  
 2011   :141   Diseases of Heart (I00-I09, I11, I13, I20-I51): 96   Female:554  
 2010   :138   Influenza (Flu) and Pneumonia (J09-J18)       : 96   Male  :540  
 2008   :136   Malignant Neoplasms (Cancer: C00-C97)         : 96               
 2014   :136   Diabetes Mellitus (E10-E14)                   : 92               
 2009   :135   Cerebrovascular Disease (Stroke: I60-I69)     : 90               
 (Other):267   (Other)                                       :528               
                    Race.Ethnicity     Deaths      Death.Rate  Age.Adjusted.Death.Rate
                           :  0    .      :138   .      :386   .      :386            
 Asian and Pacific Islander:177    5      : 28   13     :  7   17.9   :  6            
 Black Non-Hispanic        :178    8      : 22   17.3   :  7   21.4   :  6            
 Hispanic                  :177    6      : 21   11.4   :  6   6.3    :  6            
 Not Stated/Unknown        :200    10     : 15   16.3   :  6   14.1   :  5            
 Other Race/ Ethnicity     :186    7      : 15   18     :  6   14.8   :  5            
 White Non-Hispanic        :176    (Other):855   (Other):676   (Other):680            
#removing all factors from numeric data in dataframe
df$Deaths <- as.numeric(as.character(df$Deaths))
NAs introduced by coercion
df$Death.Rate <- as.numeric(as.character(df$Death.Rate))
NAs introduced by coercion
df$Age.Adjusted.Death.Rate <- as.numeric(as.character(df$Age.Adjusted.Death.Rate))
NAs introduced by coercion
df$Year <- as.numeric(as.character(df$Year))
df$Leading.Cause <-(as.character(df$Leading.Cause))
df$Sex <-(as.character(df$Sex))
df$Race.Ethnicity <-as.character(df$Race.Ethnicity)


df$Leading.Cause <- gsub("Diseases of Heart (I00-I09, I11, I13, I20-I51)", "Hearts Disease", df$Leading.Cause, perl=FALSE)
df$Leading.Cause <- gsub("Malignant Neoplasms (Cancer: C00-C97)", "Cancer", df$Leading.Cause)
df$Leading.Cause <- gsub("Influenza (Flu) and Pneumonia (J09-J18)", "Flu", df$Leading.Cause)
df$Leading.Cause <- gsub("Mental and Behavioral Disorders due to Accidental Poisoning and Other Psychoactive Substance Use (F11-F16, F18-F19, X40-X42, X44)", "Accident Poisoning", df$Leading.Cause)
df$Leading.Cause <- gsub("Diabetes Mellitus (E10-E14)", "Diabetes", df$Leading.Cause)
df$Leading.Cause <- gsub("Accidents Except Drug Poisoning (V01-X39, X43, X45-X59, Y85-Y86)", "Accidents", df$Leading.Cause)
df$Leading.Cause <- gsub("Cerebrovascular Disease (Stroke: I60-I69)", "Stroke", df$Leading.Cause)
df$Leading.Cause <- gsub("Human Immunodeficiency Virus Disease (HIV: B20-B24)", "HIV", df$Leading.Cause)

df

#gsub doesn't work, cut character strings to 10 characters
# df$Leading.Cause = substr(df$Leading.Cause, 1,15)
# df$Leading.Cause

# ===== Total Deaths Analysis ======

tot_death = sum(as.numeric(df$Deaths), na.rm = TRUE)
tot_death #424998
[1] 424998
overview = df %>% group_by (Year) %>% summarise(Total = sum(Death.Rate, na.rm = TRUE))
overview1 = df %>% group_by (Year) %>% summarise(Total1 = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))
#p <- ggplot(data=overview, aes(x=Year, y=Total)) + geom_bar(stat="identity") + labs(title="Total Death Count by Year in NYC")
Death.Count <- cbind(overview, overview1)

#dygraph(Death.Count)
dygraph(Death.Count) %>% dySeries("Total", label = "Death Rate") %>% dySeries("Total1", label = "Age Adjusted") %>% dyRangeSelector(height = 20)
Registered S3 method overwritten by 'xts':
  method     from
  as.zoo.xts zoo 

by_gender = df %>% group_by(Year, Sex) %>% summarise(Total = sum(Deaths, na.rm = TRUE))
by_gender
p1 <- ggplot(data=by_gender, aes(x=Year, y=Total, fill=Sex)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count by Gender in NYC")
p1


by_race = df %>% group_by(Year, Race.Ethnicity) %>% summarise(Total = sum(Deaths, na.rm = TRUE))
by_race
p2 <- ggplot(data=by_race, aes(x=Year, y=Total, fill=Race.Ethnicity)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count by Ethnicity in NYC")
p2


df$Dea
NULL
# male_sub <- subset(df, Sex == "Male",select = c("Year","Race.Ethnicity","Sex", "Deaths"))
# male_sub
# by_race_male = male_sub %>% group_by(Year, Race.Ethnicity) %>% summarise(Total = sum(Deaths, na.rm = TRUE))
# by_race_male
# p3 <- ggplot(data=by_race_male, aes(x=Year, y=Total, fill=Race.Ethnicity)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count for Men by Ethnicity in NYC")
# p3
# 
# female_sub <- subset(df, Sex == "Female",select = c("Year","Race.Ethnicity","Sex", "Deaths"))
# female_sub
# by_race_female = female_sub %>% group_by(Year, Race.Ethnicity) %>% summarise(Total = sum(Deaths, na.rm = TRUE))
# by_race_female
# p4 <- ggplot(data=by_race_female, aes(x=Year, y=Total, fill=Race.Ethnicity)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count for Women by Ethnicity in NYC")
# p4

by_cause = df %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Deaths, na.rm = TRUE))
by_cause 
p5 <- ggplot(data=by_cause, aes(x=Year, y=Total, fill=Leading.Cause)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count by Leading Cause in NYC")
p5


by_cause_race = df %>% group_by(Race.Ethnicity, Leading.Cause) %>% summarise(Total = sum(Deaths, na.rm = TRUE))
by_cause_race
p6 <- ggplot(data=by_cause_race, aes(x=Race.Ethnicity, y=Total, fill=Leading.Cause)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count by Leading Cause in NYC")
p6


# Age Adjusted
by_cause_age = df %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))
by_cause_age 
p7 <- ggplot(data=by_cause_age, aes(x=Year, y=Total, fill=Leading.Cause)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Age Adjusted Death Count by Leading Cause in NYC")
p7


sub = subset(df, Race.Ethnicity != "Other Race/ Ethnicity" & Race.Ethnicity != "Not Stated/Unknown", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))
sub

by_cause_race_age = df %>% group_by(Race.Ethnicity, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))
by_cause_race_age 
p8 <- ggplot(data=by_cause_race_age, aes(x=Race.Ethnicity, y=Total, fill=Leading.Cause)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Age Adjusted Death Count by Leading Cause in NYC")
p8


#======== Observing Cause of Deaths by Race and Ethnicity and Gender ============

his_sub <- subset(df, Race.Ethnicity == "Hispanic", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))



cause1= his_sub %>% group_by(Year, Leading.Cause, Sex) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 7, wt = Total)
cause1




p9 = ggplot(cause1, aes(x=Year, y=Leading.Cause, size=Total, color=Sex)) +geom_point(alpha=0.5) + scale_size(range = c(.1, 24), name="Total Death Count")
ggplotly(p9)


# Asian and Pacific Islanders

a_sub <- subset(df, Race.Ethnicity == "Asian and Pacific Islander", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))
a_sub

cause2= a_sub %>% group_by(Year, Leading.Cause, Sex) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))%>% top_n(n = 7, wt = Total)
cause2

p10 = ggplot(cause2, aes(x=Year, y=Leading.Cause, size=Total, color=Sex)) +geom_point(alpha=0.5) + scale_size(range = c(.1, 24), name="Total Death Count")
p10



# White Non-Hispanic
w_sub <- subset(df, Race.Ethnicity == "White Non-Hispanic", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))
w_sub

cause3= w_sub %>% group_by(Year, Leading.Cause, Sex) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))%>% top_n(n = 7, wt = Total)
cause3

p11 = ggplot(cause3, aes(x=Year, y=Leading.Cause, size=Total, color=Sex)) +geom_point(alpha=0.5) + scale_size(range = c(.1, 24), name="Total Death Count")
p11


#Black Non-Hispanic
b_sub <- subset(df, Race.Ethnicity == "Black Non-Hispanic", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))
b_sub

cause4= b_sub %>% group_by(Year, Leading.Cause, Sex) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))%>% top_n(n = 7, wt = Total)
cause4

p12 = ggplot(cause4, aes(x=Year, y=Leading.Cause, size=Total, color=Sex)) +geom_point(alpha=0.5) + scale_size(range = c(.1, 24), name="Total Death Count")
p12


#Oter
o_sub <- subset(df, Race.Ethnicity == "Other Race/ Ethnicity", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))
o_sub

cause5= o_sub %>% group_by(Year, Leading.Cause, Sex) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))%>% top_n(n = 7, wt = Total)
cause5

p13 = ggplot(cause5, aes(x=Year, y=Leading.Cause, size=Total, color=Sex)) +geom_point(alpha=0.5) + scale_size(range = c(.1, 24), name="Total Death Count")
p13


#= Heart Disease, Cancer and Other Causes Seem Like the Top 3 Cause of Deaths in NYC===

head(df$Leading.Cause, 10)
 [1] "Diseases of Heart (I00-I09, I11, I13, I20-I51)"                                                                                   
 [2] "Malignant Neoplasms (Cancer: C00-C97)"                                                                                            
 [3] "Influenza (Flu) and Pneumonia (J09-J18)"                                                                                          
 [4] "Mental and Behavioral Disorders due to Accidental Poisoning and Other Psychoactive Substance Use (F11-F16, F18-F19, X40-X42, X44)"
 [5] "Diabetes Mellitus (E10-E14)"                                                                                                      
 [6] "Accidents Except Drug Poisoning (V01-X39, X43, X45-X59, Y85-Y86)"                                                                 
 [7] "Cerebrovascular Disease (Stroke: I60-I69)"                                                                                        
 [8] "Chronic Liver Disease and Cirrhosis (K70, K73)"                                                                                   
 [9] "Chronic Lower Respiratory Diseases (J40-J47)"                                                                                     
[10] "Human Immunodeficiency Virus Disease (HIV: B20-B24)"                                                                              
heart_sub <- subset(df, Leading.Cause == "Diseases of Hea", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))
heart_sub

cause6= heart_sub %>% group_by(Year, Race.Ethnicity) %>% summarise(Total = sum(Deaths, na.rm = TRUE))%>% top_n(n = 7, wt = Total)
cause6

p14 <- ggplot(data=cause6, aes(x=Year, y=Total, fill=Race.Ethnicity)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count in Heart Disease by Ethnicity in NYC") + coord_flip()
p14


pic <- ggplot(cause6, aes(x = Year, y = Total)) +
        geom_boxplot(colour = line, alpha = 0.7,
                     outlier.colour = "#1F3552", outlier.shape = 20) 
        ggtitle("Boxplot of mean ozone by month") + theme_bw()
NULL
pic


cause7= heart_sub %>% group_by(Year, Race.Ethnicity) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))%>% top_n(n = 7, wt = Total)
cause7

p15 <- ggplot(data=cause7, aes(x=Year, y=Total, fill=Race.Ethnicity)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count in Heart Disease by Ethnicity in NYC") + coord_flip()
p15


#========= By Cancer 

head(df$Leading.Cause, 10)
 [1] "Diseases of Heart (I00-I09, I11, I13, I20-I51)"                                                                                   
 [2] "Malignant Neoplasms (Cancer: C00-C97)"                                                                                            
 [3] "Influenza (Flu) and Pneumonia (J09-J18)"                                                                                          
 [4] "Mental and Behavioral Disorders due to Accidental Poisoning and Other Psychoactive Substance Use (F11-F16, F18-F19, X40-X42, X44)"
 [5] "Diabetes Mellitus (E10-E14)"                                                                                                      
 [6] "Accidents Except Drug Poisoning (V01-X39, X43, X45-X59, Y85-Y86)"                                                                 
 [7] "Cerebrovascular Disease (Stroke: I60-I69)"                                                                                        
 [8] "Chronic Liver Disease and Cirrhosis (K70, K73)"                                                                                   
 [9] "Chronic Lower Respiratory Diseases (J40-J47)"                                                                                     
[10] "Human Immunodeficiency Virus Disease (HIV: B20-B24)"                                                                              
cancer_sub <- subset(df, Leading.Cause == "Malignant Neopl", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

cause8= cancer_sub %>% group_by(Year, Race.Ethnicity) %>% summarise(Total = sum(Deaths, na.rm = TRUE))%>% top_n(n = 7, wt = Total)

p16 <- ggplot(data=cause8, aes(x=Year, y=Total, fill=Race.Ethnicity)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count in Heart Disease by Ethnicity in NYC") + coord_flip()
p16


cause9= cancer_sub %>% group_by(Year, Race.Ethnicity) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE))%>% top_n(n = 7, wt = Total)

p17 <- ggplot(data=cause9, aes(x=Year, y=Total, fill=Race.Ethnicity)) + geom_bar(position = "dodge", stat="identity") + labs(title="Total Death Count in Heart Disease by Ethnicity in NYC") + coord_flip()
p17


#Top 3 causes by race and gender

his_sub_m = subset(his_sub,Sex == "Male" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

his_sub_f = subset(his_sub,Sex == "Female" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

a_sub_m = subset(a_sub,Sex == "Male" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

a_sub_f = subset(a_sub,Sex == "Female" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

w_sub_m = subset(w_sub,Sex == "Male" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

w_sub_f = subset(w_sub,Sex == "Female" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

b_sub_m = subset(his_sub,Sex == "Male" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

b_sub_f = subset(his_sub,Sex == "Female" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))
o_sub_m = subset(his_sub,Sex == "Male" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

o_sub_f = subset(his_sub,Sex == "Female" & Leading.Cause!="All Other Cause", select = c("Year","Leading.Cause", "Race.Ethnicity","Sex", "Deaths", "Age.Adjusted.Death.Rate"))

cause.1= his_sub_m %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.1

cause.2= his_sub_f %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.2

cause.3= a_sub_m %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.3

cause.4= a_sub_f %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.4

cause.5= w_sub_m %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.5

cause.6= w_sub_f %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.6

cause.7= b_sub_m %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.7

cause.8= b_sub_f %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.8

cause.9= o_sub_m %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.9

cause.10= o_sub_f %>% group_by(Year, Leading.Cause) %>% summarise(Total = sum(Age.Adjusted.Death.Rate, na.rm = TRUE)) %>% top_n(n = 3, wt = Total)
cause.10
NA
NA
NA
NA

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGR5Z3JhcGhzKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShybGlzdCkKbGlicmFyeShwbG90bHkpCgojc2V0d2QoIn4vRGVza3RvcC9XaGF0S2lsbHNOZXdZb3JrZXJzIikKZ2V0d2QoKQpkZiA9IHJlYWQuY3N2KCJOZXdfWW9ya19DaXR5X0xlYWRpbmdfQ2F1c2VzX29mX0RlYXRoLmNzdiIpCgojIE9ic2VydmUgRGF0YSAKc2FwcGx5KGRmLCBjbGFzcykKZGYgPC0gZGZbLWMoMTA5NywxMDk2LDEwOTUpLCBdCnN1bW1hcnkoZGYpCgojcmVtb3ZpbmcgYWxsIGZhY3RvcnMgZnJvbSBudW1lcmljIGRhdGEgaW4gZGF0YWZyYW1lCmRmJERlYXRocyA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZiREZWF0aHMpKQpkZiREZWF0aC5SYXRlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmJERlYXRoLlJhdGUpKQpkZiRBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZiRBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSkpCmRmJFllYXIgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGYkWWVhcikpCmRmJExlYWRpbmcuQ2F1c2UgPC0oYXMuY2hhcmFjdGVyKGRmJExlYWRpbmcuQ2F1c2UpKQpkZiRTZXggPC0oYXMuY2hhcmFjdGVyKGRmJFNleCkpCmRmJFJhY2UuRXRobmljaXR5IDwtYXMuY2hhcmFjdGVyKGRmJFJhY2UuRXRobmljaXR5KQoKCmRmJExlYWRpbmcuQ2F1c2UgPC0gZ3N1YigiRGlzZWFzZXMgb2YgSGVhcnQgKEkwMC1JMDksIEkxMSwgSTEzLCBJMjAtSTUxKSIsICJIZWFydHMgRGlzZWFzZSIsIGRmJExlYWRpbmcuQ2F1c2UsIHBlcmw9RkFMU0UpCmRmJExlYWRpbmcuQ2F1c2UgPC0gZ3N1YigiTWFsaWduYW50IE5lb3BsYXNtcyAoQ2FuY2VyOiBDMDAtQzk3KSIsICJDYW5jZXIiLCBkZiRMZWFkaW5nLkNhdXNlKQpkZiRMZWFkaW5nLkNhdXNlIDwtIGdzdWIoIkluZmx1ZW56YSAoRmx1KSBhbmQgUG5ldW1vbmlhIChKMDktSjE4KSIsICJGbHUiLCBkZiRMZWFkaW5nLkNhdXNlKQpkZiRMZWFkaW5nLkNhdXNlIDwtIGdzdWIoIk1lbnRhbCBhbmQgQmVoYXZpb3JhbCBEaXNvcmRlcnMgZHVlIHRvIEFjY2lkZW50YWwgUG9pc29uaW5nIGFuZCBPdGhlciBQc3ljaG9hY3RpdmUgU3Vic3RhbmNlIFVzZSAoRjExLUYxNiwgRjE4LUYxOSwgWDQwLVg0MiwgWDQ0KSIsICJBY2NpZGVudCBQb2lzb25pbmciLCBkZiRMZWFkaW5nLkNhdXNlKQpkZiRMZWFkaW5nLkNhdXNlIDwtIGdzdWIoIkRpYWJldGVzIE1lbGxpdHVzIChFMTAtRTE0KSIsICJEaWFiZXRlcyIsIGRmJExlYWRpbmcuQ2F1c2UpCmRmJExlYWRpbmcuQ2F1c2UgPC0gZ3N1YigiQWNjaWRlbnRzIEV4Y2VwdCBEcnVnIFBvaXNvbmluZyAoVjAxLVgzOSwgWDQzLCBYNDUtWDU5LCBZODUtWTg2KSIsICJBY2NpZGVudHMiLCBkZiRMZWFkaW5nLkNhdXNlKQpkZiRMZWFkaW5nLkNhdXNlIDwtIGdzdWIoIkNlcmVicm92YXNjdWxhciBEaXNlYXNlIChTdHJva2U6IEk2MC1JNjkpIiwgIlN0cm9rZSIsIGRmJExlYWRpbmcuQ2F1c2UpCmRmJExlYWRpbmcuQ2F1c2UgPC0gZ3N1YigiSHVtYW4gSW1tdW5vZGVmaWNpZW5jeSBWaXJ1cyBEaXNlYXNlIChISVY6IEIyMC1CMjQpIiwgIkhJViIsIGRmJExlYWRpbmcuQ2F1c2UpCgpkZgoKI2dzdWIgZG9lc24ndCB3b3JrLCBjdXQgY2hhcmFjdGVyIHN0cmluZ3MgdG8gMTAgY2hhcmFjdGVycwojIGRmJExlYWRpbmcuQ2F1c2UgPSBzdWJzdHIoZGYkTGVhZGluZy5DYXVzZSwgMSwxNSkKIyBkZiRMZWFkaW5nLkNhdXNlCgojID09PT09IFRvdGFsIERlYXRocyBBbmFseXNpcyA9PT09PT0KCnRvdF9kZWF0aCA9IHN1bShhcy5udW1lcmljKGRmJERlYXRocyksIG5hLnJtID0gVFJVRSkKdG90X2RlYXRoICM0MjQ5OTgKCm92ZXJ2aWV3ID0gZGYgJT4lIGdyb3VwX2J5IChZZWFyKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKERlYXRoLlJhdGUsIG5hLnJtID0gVFJVRSkpCm92ZXJ2aWV3MSA9IGRmICU+JSBncm91cF9ieSAoWWVhcikgJT4lIHN1bW1hcmlzZShUb3RhbDEgPSBzdW0oQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUsIG5hLnJtID0gVFJVRSkpCiNwIDwtIGdncGxvdChkYXRhPW92ZXJ2aWV3LCBhZXMoeD1ZZWFyLCB5PVRvdGFsKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgbGFicyh0aXRsZT0iVG90YWwgRGVhdGggQ291bnQgYnkgWWVhciBpbiBOWUMiKQpEZWF0aC5Db3VudCA8LSBjYmluZChvdmVydmlldywgb3ZlcnZpZXcxKQoKI2R5Z3JhcGgoRGVhdGguQ291bnQpCmR5Z3JhcGgoRGVhdGguQ291bnQpICU+JSBkeVNlcmllcygiVG90YWwiLCBsYWJlbCA9ICJEZWF0aCBSYXRlIikgJT4lIGR5U2VyaWVzKCJUb3RhbDEiLCBsYWJlbCA9ICJBZ2UgQWRqdXN0ZWQiKSAlPiUgZHlSYW5nZVNlbGVjdG9yKGhlaWdodCA9IDIwKQoKCgpieV9nZW5kZXIgPSBkZiAlPiUgZ3JvdXBfYnkoWWVhciwgU2V4KSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKERlYXRocywgbmEucm0gPSBUUlVFKSkKYnlfZ2VuZGVyCnAxIDwtIGdncGxvdChkYXRhPWJ5X2dlbmRlciwgYWVzKHg9WWVhciwgeT1Ub3RhbCwgZmlsbD1TZXgpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArIGxhYnModGl0bGU9IlRvdGFsIERlYXRoIENvdW50IGJ5IEdlbmRlciBpbiBOWUMiKQpwMQoKYnlfcmFjZSA9IGRmICU+JSBncm91cF9ieShZZWFyLCBSYWNlLkV0aG5pY2l0eSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShEZWF0aHMsIG5hLnJtID0gVFJVRSkpCmJ5X3JhY2UKcDIgPC0gZ2dwbG90KGRhdGE9YnlfcmFjZSwgYWVzKHg9WWVhciwgeT1Ub3RhbCwgZmlsbD1SYWNlLkV0aG5pY2l0eSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsgbGFicyh0aXRsZT0iVG90YWwgRGVhdGggQ291bnQgYnkgRXRobmljaXR5IGluIE5ZQyIpCnAyCgpkZiREZWEKCiMgbWFsZV9zdWIgPC0gc3Vic2V0KGRmLCBTZXggPT0gIk1hbGUiLHNlbGVjdCA9IGMoIlllYXIiLCJSYWNlLkV0aG5pY2l0eSIsIlNleCIsICJEZWF0aHMiKSkKIyBtYWxlX3N1YgojIGJ5X3JhY2VfbWFsZSA9IG1hbGVfc3ViICU+JSBncm91cF9ieShZZWFyLCBSYWNlLkV0aG5pY2l0eSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShEZWF0aHMsIG5hLnJtID0gVFJVRSkpCiMgYnlfcmFjZV9tYWxlCiMgcDMgPC0gZ2dwbG90KGRhdGE9YnlfcmFjZV9tYWxlLCBhZXMoeD1ZZWFyLCB5PVRvdGFsLCBmaWxsPVJhY2UuRXRobmljaXR5KSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKyBsYWJzKHRpdGxlPSJUb3RhbCBEZWF0aCBDb3VudCBmb3IgTWVuIGJ5IEV0aG5pY2l0eSBpbiBOWUMiKQojIHAzCiMgCiMgZmVtYWxlX3N1YiA8LSBzdWJzZXQoZGYsIFNleCA9PSAiRmVtYWxlIixzZWxlY3QgPSBjKCJZZWFyIiwiUmFjZS5FdGhuaWNpdHkiLCJTZXgiLCAiRGVhdGhzIikpCiMgZmVtYWxlX3N1YgojIGJ5X3JhY2VfZmVtYWxlID0gZmVtYWxlX3N1YiAlPiUgZ3JvdXBfYnkoWWVhciwgUmFjZS5FdGhuaWNpdHkpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oRGVhdGhzLCBuYS5ybSA9IFRSVUUpKQojIGJ5X3JhY2VfZmVtYWxlCiMgcDQgPC0gZ2dwbG90KGRhdGE9YnlfcmFjZV9mZW1hbGUsIGFlcyh4PVllYXIsIHk9VG90YWwsIGZpbGw9UmFjZS5FdGhuaWNpdHkpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArIGxhYnModGl0bGU9IlRvdGFsIERlYXRoIENvdW50IGZvciBXb21lbiBieSBFdGhuaWNpdHkgaW4gTllDIikKIyBwNAoKYnlfY2F1c2UgPSBkZiAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShEZWF0aHMsIG5hLnJtID0gVFJVRSkpCmJ5X2NhdXNlIApwNSA8LSBnZ3Bsb3QoZGF0YT1ieV9jYXVzZSwgYWVzKHg9WWVhciwgeT1Ub3RhbCwgZmlsbD1MZWFkaW5nLkNhdXNlKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKyBsYWJzKHRpdGxlPSJUb3RhbCBEZWF0aCBDb3VudCBieSBMZWFkaW5nIENhdXNlIGluIE5ZQyIpCnA1CgpieV9jYXVzZV9yYWNlID0gZGYgJT4lIGdyb3VwX2J5KFJhY2UuRXRobmljaXR5LCBMZWFkaW5nLkNhdXNlKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKERlYXRocywgbmEucm0gPSBUUlVFKSkKYnlfY2F1c2VfcmFjZQpwNiA8LSBnZ3Bsb3QoZGF0YT1ieV9jYXVzZV9yYWNlLCBhZXMoeD1SYWNlLkV0aG5pY2l0eSwgeT1Ub3RhbCwgZmlsbD1MZWFkaW5nLkNhdXNlKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKyBsYWJzKHRpdGxlPSJUb3RhbCBEZWF0aCBDb3VudCBieSBMZWFkaW5nIENhdXNlIGluIE5ZQyIpCnA2CgojIEFnZSBBZGp1c3RlZApieV9jYXVzZV9hZ2UgPSBkZiAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSkKYnlfY2F1c2VfYWdlIApwNyA8LSBnZ3Bsb3QoZGF0YT1ieV9jYXVzZV9hZ2UsIGFlcyh4PVllYXIsIHk9VG90YWwsIGZpbGw9TGVhZGluZy5DYXVzZSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsgbGFicyh0aXRsZT0iVG90YWwgQWdlIEFkanVzdGVkIERlYXRoIENvdW50IGJ5IExlYWRpbmcgQ2F1c2UgaW4gTllDIikKcDcKCnN1YiA9IHN1YnNldChkZiwgUmFjZS5FdGhuaWNpdHkgIT0gIk90aGVyIFJhY2UvIEV0aG5pY2l0eSIgJiBSYWNlLkV0aG5pY2l0eSAhPSAiTm90IFN0YXRlZC9Vbmtub3duIiwgc2VsZWN0ID0gYygiWWVhciIsIkxlYWRpbmcuQ2F1c2UiLCAiUmFjZS5FdGhuaWNpdHkiLCJTZXgiLCAiRGVhdGhzIiwgIkFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlIikpCnN1YgoKYnlfY2F1c2VfcmFjZV9hZ2UgPSBkZiAlPiUgZ3JvdXBfYnkoUmFjZS5FdGhuaWNpdHksIExlYWRpbmcuQ2F1c2UpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUsIG5hLnJtID0gVFJVRSkpCmJ5X2NhdXNlX3JhY2VfYWdlIApwOCA8LSBnZ3Bsb3QoZGF0YT1ieV9jYXVzZV9yYWNlX2FnZSwgYWVzKHg9UmFjZS5FdGhuaWNpdHksIHk9VG90YWwsIGZpbGw9TGVhZGluZy5DYXVzZSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsgbGFicyh0aXRsZT0iVG90YWwgQWdlIEFkanVzdGVkIERlYXRoIENvdW50IGJ5IExlYWRpbmcgQ2F1c2UgaW4gTllDIikKcDgKCiM9PT09PT09PSBPYnNlcnZpbmcgQ2F1c2Ugb2YgRGVhdGhzIGJ5IFJhY2UgYW5kIEV0aG5pY2l0eSBhbmQgR2VuZGVyID09PT09PT09PT09PQoKaGlzX3N1YiA8LSBzdWJzZXQoZGYsIFJhY2UuRXRobmljaXR5ID09ICJIaXNwYW5pYyIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQoKCgpjYXVzZTE9IGhpc19zdWIgJT4lIGdyb3VwX2J5KFllYXIsIExlYWRpbmcuQ2F1c2UsIFNleCkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSkgJT4lIHRvcF9uKG4gPSA3LCB3dCA9IFRvdGFsKQpjYXVzZTEKCgoKCnA5ID0gZ2dwbG90KGNhdXNlMSwgYWVzKHg9WWVhciwgeT1MZWFkaW5nLkNhdXNlLCBzaXplPVRvdGFsLCBjb2xvcj1TZXgpKSArZ2VvbV9wb2ludChhbHBoYT0wLjUpICsgc2NhbGVfc2l6ZShyYW5nZSA9IGMoLjEsIDI0KSwgbmFtZT0iVG90YWwgRGVhdGggQ291bnQiKQpnZ3Bsb3RseShwOSkKCiMgQXNpYW4gYW5kIFBhY2lmaWMgSXNsYW5kZXJzCgphX3N1YiA8LSBzdWJzZXQoZGYsIFJhY2UuRXRobmljaXR5ID09ICJBc2lhbiBhbmQgUGFjaWZpYyBJc2xhbmRlciIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQphX3N1YgoKY2F1c2UyPSBhX3N1YiAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSwgU2V4KSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSU+JSB0b3BfbihuID0gNywgd3QgPSBUb3RhbCkKY2F1c2UyCgpwMTAgPSBnZ3Bsb3QoY2F1c2UyLCBhZXMoeD1ZZWFyLCB5PUxlYWRpbmcuQ2F1c2UsIHNpemU9VG90YWwsIGNvbG9yPVNleCkpICtnZW9tX3BvaW50KGFscGhhPTAuNSkgKyBzY2FsZV9zaXplKHJhbmdlID0gYyguMSwgMjQpLCBuYW1lPSJUb3RhbCBEZWF0aCBDb3VudCIpCnAxMAoKCiMgV2hpdGUgTm9uLUhpc3BhbmljCndfc3ViIDwtIHN1YnNldChkZiwgUmFjZS5FdGhuaWNpdHkgPT0gIldoaXRlIE5vbi1IaXNwYW5pYyIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQp3X3N1YgoKY2F1c2UzPSB3X3N1YiAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSwgU2V4KSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSU+JSB0b3BfbihuID0gNywgd3QgPSBUb3RhbCkKY2F1c2UzCgpwMTEgPSBnZ3Bsb3QoY2F1c2UzLCBhZXMoeD1ZZWFyLCB5PUxlYWRpbmcuQ2F1c2UsIHNpemU9VG90YWwsIGNvbG9yPVNleCkpICtnZW9tX3BvaW50KGFscGhhPTAuNSkgKyBzY2FsZV9zaXplKHJhbmdlID0gYyguMSwgMjQpLCBuYW1lPSJUb3RhbCBEZWF0aCBDb3VudCIpCnAxMQoKI0JsYWNrIE5vbi1IaXNwYW5pYwpiX3N1YiA8LSBzdWJzZXQoZGYsIFJhY2UuRXRobmljaXR5ID09ICJCbGFjayBOb24tSGlzcGFuaWMiLCBzZWxlY3QgPSBjKCJZZWFyIiwiTGVhZGluZy5DYXVzZSIsICJSYWNlLkV0aG5pY2l0eSIsIlNleCIsICJEZWF0aHMiLCAiQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUiKSkKYl9zdWIKCmNhdXNlND0gYl9zdWIgJT4lIGdyb3VwX2J5KFllYXIsIExlYWRpbmcuQ2F1c2UsIFNleCkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSklPiUgdG9wX24obiA9IDcsIHd0ID0gVG90YWwpCmNhdXNlNAoKcDEyID0gZ2dwbG90KGNhdXNlNCwgYWVzKHg9WWVhciwgeT1MZWFkaW5nLkNhdXNlLCBzaXplPVRvdGFsLCBjb2xvcj1TZXgpKSArZ2VvbV9wb2ludChhbHBoYT0wLjUpICsgc2NhbGVfc2l6ZShyYW5nZSA9IGMoLjEsIDI0KSwgbmFtZT0iVG90YWwgRGVhdGggQ291bnQiKQpwMTIKCiNPdGVyCm9fc3ViIDwtIHN1YnNldChkZiwgUmFjZS5FdGhuaWNpdHkgPT0gIk90aGVyIFJhY2UvIEV0aG5pY2l0eSIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQpvX3N1YgoKY2F1c2U1PSBvX3N1YiAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSwgU2V4KSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSU+JSB0b3BfbihuID0gNywgd3QgPSBUb3RhbCkKY2F1c2U1CgpwMTMgPSBnZ3Bsb3QoY2F1c2U1LCBhZXMoeD1ZZWFyLCB5PUxlYWRpbmcuQ2F1c2UsIHNpemU9VG90YWwsIGNvbG9yPVNleCkpICtnZW9tX3BvaW50KGFscGhhPTAuNSkgKyBzY2FsZV9zaXplKHJhbmdlID0gYyguMSwgMjQpLCBuYW1lPSJUb3RhbCBEZWF0aCBDb3VudCIpCnAxMwoKIz0gSGVhcnQgRGlzZWFzZSwgQ2FuY2VyIGFuZCBPdGhlciBDYXVzZXMgU2VlbSBMaWtlIHRoZSBUb3AgMyBDYXVzZSBvZiBEZWF0aHMgaW4gTllDPT09CgpoZWFkKGRmJExlYWRpbmcuQ2F1c2UsIDEwKQpoZWFydF9zdWIgPC0gc3Vic2V0KGRmLCBMZWFkaW5nLkNhdXNlID09ICJEaXNlYXNlcyBvZiBIZWEiLCBzZWxlY3QgPSBjKCJZZWFyIiwiTGVhZGluZy5DYXVzZSIsICJSYWNlLkV0aG5pY2l0eSIsIlNleCIsICJEZWF0aHMiLCAiQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUiKSkKaGVhcnRfc3ViCgpjYXVzZTY9IGhlYXJ0X3N1YiAlPiUgZ3JvdXBfYnkoWWVhciwgUmFjZS5FdGhuaWNpdHkpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oRGVhdGhzLCBuYS5ybSA9IFRSVUUpKSU+JSB0b3BfbihuID0gNywgd3QgPSBUb3RhbCkKY2F1c2U2CgpwMTQgPC0gZ2dwbG90KGRhdGE9Y2F1c2U2LCBhZXMoeD1ZZWFyLCB5PVRvdGFsLCBmaWxsPVJhY2UuRXRobmljaXR5KSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKyBsYWJzKHRpdGxlPSJUb3RhbCBEZWF0aCBDb3VudCBpbiBIZWFydCBEaXNlYXNlIGJ5IEV0aG5pY2l0eSBpbiBOWUMiKSArIGNvb3JkX2ZsaXAoKQpwMTQKCnBpYyA8LSBnZ3Bsb3QoY2F1c2U2LCBhZXMoeCA9IFllYXIsIHkgPSBUb3RhbCkpICsKICAgICAgICBnZW9tX2JveHBsb3QoY29sb3VyID0gbGluZSwgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIuY29sb3VyID0gIiMxRjM1NTIiLCBvdXRsaWVyLnNoYXBlID0gMjApIAogICAgICAgIGdndGl0bGUoIkJveHBsb3Qgb2YgbWVhbiBvem9uZSBieSBtb250aCIpICsgdGhlbWVfYncoKQpwaWMKCmNhdXNlNz0gaGVhcnRfc3ViICU+JSBncm91cF9ieShZZWFyLCBSYWNlLkV0aG5pY2l0eSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSklPiUgdG9wX24obiA9IDcsIHd0ID0gVG90YWwpCmNhdXNlNwoKcDE1IDwtIGdncGxvdChkYXRhPWNhdXNlNywgYWVzKHg9WWVhciwgeT1Ub3RhbCwgZmlsbD1SYWNlLkV0aG5pY2l0eSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsgbGFicyh0aXRsZT0iVG90YWwgRGVhdGggQ291bnQgaW4gSGVhcnQgRGlzZWFzZSBieSBFdGhuaWNpdHkgaW4gTllDIikgKyBjb29yZF9mbGlwKCkKcDE1CgojPT09PT09PT09IEJ5IENhbmNlciAKCmhlYWQoZGYkTGVhZGluZy5DYXVzZSwgMTApCmNhbmNlcl9zdWIgPC0gc3Vic2V0KGRmLCBMZWFkaW5nLkNhdXNlID09ICJNYWxpZ25hbnQgTmVvcGwiLCBzZWxlY3QgPSBjKCJZZWFyIiwiTGVhZGluZy5DYXVzZSIsICJSYWNlLkV0aG5pY2l0eSIsIlNleCIsICJEZWF0aHMiLCAiQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUiKSkKCmNhdXNlOD0gY2FuY2VyX3N1YiAlPiUgZ3JvdXBfYnkoWWVhciwgUmFjZS5FdGhuaWNpdHkpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oRGVhdGhzLCBuYS5ybSA9IFRSVUUpKSU+JSB0b3BfbihuID0gNywgd3QgPSBUb3RhbCkKCnAxNiA8LSBnZ3Bsb3QoZGF0YT1jYXVzZTgsIGFlcyh4PVllYXIsIHk9VG90YWwsIGZpbGw9UmFjZS5FdGhuaWNpdHkpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArIGxhYnModGl0bGU9IlRvdGFsIERlYXRoIENvdW50IGluIEhlYXJ0IERpc2Vhc2UgYnkgRXRobmljaXR5IGluIE5ZQyIpICsgY29vcmRfZmxpcCgpCnAxNgoKY2F1c2U5PSBjYW5jZXJfc3ViICU+JSBncm91cF9ieShZZWFyLCBSYWNlLkV0aG5pY2l0eSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSklPiUgdG9wX24obiA9IDcsIHd0ID0gVG90YWwpCgpwMTcgPC0gZ2dwbG90KGRhdGE9Y2F1c2U5LCBhZXMoeD1ZZWFyLCB5PVRvdGFsLCBmaWxsPVJhY2UuRXRobmljaXR5KSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKyBsYWJzKHRpdGxlPSJUb3RhbCBEZWF0aCBDb3VudCBpbiBIZWFydCBEaXNlYXNlIGJ5IEV0aG5pY2l0eSBpbiBOWUMiKSArIGNvb3JkX2ZsaXAoKQpwMTcKCiNUb3AgMyBjYXVzZXMgYnkgcmFjZSBhbmQgZ2VuZGVyCgpoaXNfc3ViX20gPSBzdWJzZXQoaGlzX3N1YixTZXggPT0gIk1hbGUiICYgTGVhZGluZy5DYXVzZSE9IkFsbCBPdGhlciBDYXVzZSIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQoKaGlzX3N1Yl9mID0gc3Vic2V0KGhpc19zdWIsU2V4ID09ICJGZW1hbGUiICYgTGVhZGluZy5DYXVzZSE9IkFsbCBPdGhlciBDYXVzZSIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQoKYV9zdWJfbSA9IHN1YnNldChhX3N1YixTZXggPT0gIk1hbGUiICYgTGVhZGluZy5DYXVzZSE9IkFsbCBPdGhlciBDYXVzZSIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQoKYV9zdWJfZiA9IHN1YnNldChhX3N1YixTZXggPT0gIkZlbWFsZSIgJiBMZWFkaW5nLkNhdXNlIT0iQWxsIE90aGVyIENhdXNlIiwgc2VsZWN0ID0gYygiWWVhciIsIkxlYWRpbmcuQ2F1c2UiLCAiUmFjZS5FdGhuaWNpdHkiLCJTZXgiLCAiRGVhdGhzIiwgIkFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlIikpCgp3X3N1Yl9tID0gc3Vic2V0KHdfc3ViLFNleCA9PSAiTWFsZSIgJiBMZWFkaW5nLkNhdXNlIT0iQWxsIE90aGVyIENhdXNlIiwgc2VsZWN0ID0gYygiWWVhciIsIkxlYWRpbmcuQ2F1c2UiLCAiUmFjZS5FdGhuaWNpdHkiLCJTZXgiLCAiRGVhdGhzIiwgIkFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlIikpCgp3X3N1Yl9mID0gc3Vic2V0KHdfc3ViLFNleCA9PSAiRmVtYWxlIiAmIExlYWRpbmcuQ2F1c2UhPSJBbGwgT3RoZXIgQ2F1c2UiLCBzZWxlY3QgPSBjKCJZZWFyIiwiTGVhZGluZy5DYXVzZSIsICJSYWNlLkV0aG5pY2l0eSIsIlNleCIsICJEZWF0aHMiLCAiQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUiKSkKCmJfc3ViX20gPSBzdWJzZXQoaGlzX3N1YixTZXggPT0gIk1hbGUiICYgTGVhZGluZy5DYXVzZSE9IkFsbCBPdGhlciBDYXVzZSIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQoKYl9zdWJfZiA9IHN1YnNldChoaXNfc3ViLFNleCA9PSAiRmVtYWxlIiAmIExlYWRpbmcuQ2F1c2UhPSJBbGwgT3RoZXIgQ2F1c2UiLCBzZWxlY3QgPSBjKCJZZWFyIiwiTGVhZGluZy5DYXVzZSIsICJSYWNlLkV0aG5pY2l0eSIsIlNleCIsICJEZWF0aHMiLCAiQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUiKSkKb19zdWJfbSA9IHN1YnNldChoaXNfc3ViLFNleCA9PSAiTWFsZSIgJiBMZWFkaW5nLkNhdXNlIT0iQWxsIE90aGVyIENhdXNlIiwgc2VsZWN0ID0gYygiWWVhciIsIkxlYWRpbmcuQ2F1c2UiLCAiUmFjZS5FdGhuaWNpdHkiLCJTZXgiLCAiRGVhdGhzIiwgIkFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlIikpCgpvX3N1Yl9mID0gc3Vic2V0KGhpc19zdWIsU2V4ID09ICJGZW1hbGUiICYgTGVhZGluZy5DYXVzZSE9IkFsbCBPdGhlciBDYXVzZSIsIHNlbGVjdCA9IGMoIlllYXIiLCJMZWFkaW5nLkNhdXNlIiwgIlJhY2UuRXRobmljaXR5IiwiU2V4IiwgIkRlYXRocyIsICJBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSIpKQoKY2F1c2UuMT0gaGlzX3N1Yl9tICU+JSBncm91cF9ieShZZWFyLCBMZWFkaW5nLkNhdXNlKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSAlPiUgdG9wX24obiA9IDMsIHd0ID0gVG90YWwpCmNhdXNlLjEKCmNhdXNlLjI9IGhpc19zdWJfZiAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSkgJT4lIHRvcF9uKG4gPSAzLCB3dCA9IFRvdGFsKQpjYXVzZS4yCgpjYXVzZS4zPSBhX3N1Yl9tICU+JSBncm91cF9ieShZZWFyLCBMZWFkaW5nLkNhdXNlKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSAlPiUgdG9wX24obiA9IDMsIHd0ID0gVG90YWwpCmNhdXNlLjMKCmNhdXNlLjQ9IGFfc3ViX2YgJT4lIGdyb3VwX2J5KFllYXIsIExlYWRpbmcuQ2F1c2UpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUsIG5hLnJtID0gVFJVRSkpICU+JSB0b3BfbihuID0gMywgd3QgPSBUb3RhbCkKY2F1c2UuNAoKY2F1c2UuNT0gd19zdWJfbSAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSkgJT4lIHRvcF9uKG4gPSAzLCB3dCA9IFRvdGFsKQpjYXVzZS41CgpjYXVzZS42PSB3X3N1Yl9mICU+JSBncm91cF9ieShZZWFyLCBMZWFkaW5nLkNhdXNlKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSAlPiUgdG9wX24obiA9IDMsIHd0ID0gVG90YWwpCmNhdXNlLjYKCmNhdXNlLjc9IGJfc3ViX20gJT4lIGdyb3VwX2J5KFllYXIsIExlYWRpbmcuQ2F1c2UpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oQWdlLkFkanVzdGVkLkRlYXRoLlJhdGUsIG5hLnJtID0gVFJVRSkpICU+JSB0b3BfbihuID0gMywgd3QgPSBUb3RhbCkKY2F1c2UuNwoKY2F1c2UuOD0gYl9zdWJfZiAlPiUgZ3JvdXBfYnkoWWVhciwgTGVhZGluZy5DYXVzZSkgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShBZ2UuQWRqdXN0ZWQuRGVhdGguUmF0ZSwgbmEucm0gPSBUUlVFKSkgJT4lIHRvcF9uKG4gPSAzLCB3dCA9IFRvdGFsKQpjYXVzZS44CgpjYXVzZS45PSBvX3N1Yl9tICU+JSBncm91cF9ieShZZWFyLCBMZWFkaW5nLkNhdXNlKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSAlPiUgdG9wX24obiA9IDMsIHd0ID0gVG90YWwpCmNhdXNlLjkKCmNhdXNlLjEwPSBvX3N1Yl9mICU+JSBncm91cF9ieShZZWFyLCBMZWFkaW5nLkNhdXNlKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKEFnZS5BZGp1c3RlZC5EZWF0aC5SYXRlLCBuYS5ybSA9IFRSVUUpKSAlPiUgdG9wX24obiA9IDMsIHd0ID0gVG90YWwpCmNhdXNlLjEwCgoKCgpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgo=